/**
 * @file Matching
 * @author Ruiming Guo (guoruiming@stu.scu.edu.cn)
 * @brief 又到了乱点鸳鸯谱的时间。
 *
 * 给定二分图，两个集合都有 N 个点，a_{i,j}=1 表示第一个集合第 i
 * 个点与第二个集合第 j 个点连边。 求二分图完备匹配数，答案对 10^9+7 取模
 * @version 1.0
 * @date 2022-05-11
 *
 * @copyright Copyright (c) 2022
 *
 **/

#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
const int N = 21;
int n, a[N][N], dp[1 << N];
int main() {
  cin >> n;
  for (int i = 0; i < n; ++i)
    for (int j = 0; j < n; ++j) cin >> a[i][j];

  dp[0] = 1;
  for (int mask = 1; mask < 1 << n; ++mask) {
    int i = __builtin_popcount(mask) - 1;
    for (int j = 0; j < n; ++j)
      if (a[i][j] && mask & 1 << j) {
        dp[mask] = (dp[mask] + dp[mask - (1 << j)]) % mod;
      }
  }
  cout << dp[(1 << n) - 1] << endl;
}
